package main

import (
	"context"
	"examProject/intelnal/formValidate"
	"examProject/pkg/golbal"
	"github.com/gin-gonic/gin/binding"
	"github.com/go-playground/validator/v10"
	"go.uber.org/zap"
	"log"
	"net/http"
	"os"
	"os/signal"
	"time"
)

func main() {
	zap.S().Infow(
		"Started ApiServer：：：",
		zap.String("Host", "127.0.0.1"),
		zap.Int("Port", 8080),
	)

	zap.S().Info("Api is running!!!!")
	// 健康检查
	go func() {
		http.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) {
			w.WriteHeader(http.StatusOK)
		})
		if err := http.ListenAndServe(":8081", nil); err != nil {
			log.Fatalf("health check: %s\n", err)
		}
	}()
	// 获取consul列表
	//golbal.ConsulClient.GetServiceList()
	// 获取单个服务
	//
	//GetServiceList()
	//自定义验证器
	if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
		v.RegisterValidation("ValidateMobile", formValidate.ValidateMobile)
	}

	srv := &http.Server{
		Addr:    ":8080",
		Handler: golbal.Router,
	}

	go func() {
		// 服务连接
		if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
			log.Fatalf("listen: %s\n", err)
		}
	}()

	// 等待中断信号以优雅地关闭服务器（设置 5 秒的超时时间）
	quit := make(chan os.Signal, 1)
	signal.Notify(quit, os.Interrupt)
	<-quit
	log.Println("Shutdown Server ...")

	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
	defer cancel()
	if err := srv.Shutdown(ctx); err != nil {
		log.Fatal("Server Shutdown:", err)
	}
	log.Println("Server exiting")
}
